home *** CD-ROM | disk | FTP | other *** search
- #include "common.hpp"
-
-
- CSelControlDlg::CSelControlDlg(CDeviceView &view, CDeviceControl &control, BOOL bReselect, DWORD dwOfs, const DIDEVICEINSTANCEW &didi) :
- m_bReselect(bReselect), m_dwOfs(dwOfs), m_didi(didi),
- m_view(view), m_control(control), m_bAssigned(FALSE), m_bNoItems(TRUE)
- {
- }
-
- CSelControlDlg::~CSelControlDlg()
- {
- }
-
- int CSelControlDlg::DoModal(HWND hParent)
- {
- return CFlexWnd::DoModal(hParent, IDD_SELCONTROLDLG, g_hModule);
- }
-
- BOOL CALLBACK AddItem(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef)
- {
- if (pvRef == NULL || lpddoi == NULL)
- return DIENUM_CONTINUE;
- return ((CSelControlDlg *)pvRef)->AddItem(*lpddoi);
- }
-
- BOOL CSelControlDlg::AddItem(const DIDEVICEOBJECTINSTANCE &doi)
- {
- if (m_hList == NULL || m_view.DoesCalloutOtherThanSpecifiedExistForOffset(&m_control, doi.dwType))
- return DIENUM_CONTINUE;
-
- LRESULT i = SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)doi.tszName);
- if (i == LB_ERR || i == LB_ERRSPACE)
- return DIENUM_CONTINUE;
-
- m_bNoItems = FALSE;
-
- i = SendMessage(m_hList, LB_SETITEMDATA, (WPARAM)i, (LPARAM)doi.dwType);
-
- return DIENUM_CONTINUE;
- }
-
- void CSelControlDlg::OnInit()
- {
- m_hList = GetDlgItem(m_hWnd, IDC_LIST);
- if (m_hList == NULL)
- return;
-
- LPDIRECTINPUTDEVICE8 pDID = NULL;
- LPDIRECTINPUT8 pDI = NULL;
- DWORD dwVer = DIRECTINPUT_VERSION;
- HRESULT hr;
- if (FAILED(hr = DirectInput8Create(g_hModule, dwVer, IID_IDirectInput8, (LPVOID*)&pDI, NULL)))
- return;
-
- if (FAILED(hr = pDI->CreateDevice(m_didi.guidInstance, &pDID, NULL)))
- {
- pDID = NULL;
- return;
- }
-
- pDI->Release();
- pDI = NULL;
-
- if (FAILED(hr = pDID->EnumObjects(::AddItem, this, DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV)))
- return;
-
- pDID->Release();
- pDID = NULL;
-
- if (m_bNoItems)
- {
- EndDialog(SCDR_NOFREE);
- return;
- }
-
- // indicate callout offset assignment...
- int i = -1;
-
- if (m_control.IsOffsetAssigned())
- {
- BOOL m_bAssigned = TRUE;
- m_dwOfs = m_control.GetOffset();
- i = GetItemWithOffset(m_dwOfs);
- }
-
- SendMessage(m_hList, LB_SETCURSEL, (WPARAM)i, 0);
- }
-
- LRESULT CSelControlDlg::OnCommand(WORD wNotifyCode, WORD wID, HWND hWnd)
- {
- switch (wNotifyCode)
- {
- case LBN_SELCHANGE:
- {
- if (m_hList == NULL || m_hList != hWnd)
- break;
-
- LRESULT lr = SendMessage(m_hList, LB_GETCURSEL, 0, 0);
- if (lr == LB_ERR)
- break;
-
- lr = SendMessage(m_hList, LB_GETITEMDATA, (WPARAM)lr, 0);
- if (lr == LB_ERR)
- break;
-
- m_dwOfs = (DWORD)lr;
- m_bAssigned = TRUE;
- break;
- }
-
- case BN_CLICKED:
- switch (wID)
- {
- case IDOK:
- if (m_bAssigned)
- EndDialog(SCDR_OK);
- else
- MessageBox(m_hWnd, TEXT("You must either select a control for this callout or click cancel."), TEXT("Select a Control"), MB_OK);
- break;
-
- case IDCANCEL:
- EndDialog(SCDR_CANCEL);
- break;
- }
- break;
- }
-
- return 0;
- }
-
- int CSelControlDlg::GetItemWithOffset(DWORD dwOfs)
- {
- if (m_hList == NULL)
- return -1;
-
- LRESULT lr = SendMessage(m_hList, LB_GETCOUNT, 0, 0);
- if (lr == LB_ERR)
- return -1;
-
- int n = int(lr);
-
- if (n < 1)
- return -1;
-
- for (int i = 0; i < n; i++)
- {
- lr = SendMessage(m_hList, LB_GETITEMDATA, (WPARAM)i, 0);
- if (lr == LB_ERR)
- continue;
-
- if ((DWORD)lr == dwOfs)
- return i;
- }
- return -1;
- }
-